μ±λ₯ λ° μ¬μ©μ κ²½ν ν₯μμ μν λΌμ°νΈ κΈ°λ° λ° μ»΄ν¬λνΈ κΈ°λ° μ κ·Ό λ°©μμ μ΄μ μ λ§μΆ νλ‘ νΈμλ μ½λ μ€ν리ν κΈ°μ μ’ ν© κ°μ΄λ.
νλ‘ νΈμλ μ½λ μ€ν리ν : λΌμ°νΈ κΈ°λ° λ° μ»΄ν¬λνΈ κΈ°λ°
νλ μΉ κ°λ° λΆμΌμμ λΉ λ₯΄κ³ λ°μμ±μ΄ λ°μ΄λ μ¬μ©μ κ²½νμ μ 곡νλ κ²μ λ§€μ° μ€μν©λλ€. μ ν리μΌμ΄μ μ΄ λ³΅μ‘ν΄μ§μλ‘ μλ°μ€ν¬λ¦½νΈ λ²λ€ ν¬κΈ°κ° μ»€μ Έ μ΄κΈ° λ‘λ μκ°μ΄ κΈΈμ΄μ§κ³ μ¬μ©μ κ²½νμ΄ μ νλ μ μμ΅λλ€. μ½λ μ€ν리ν μ μ ν리μΌμ΄μ μ½λλ₯Ό λ μκ³ κ΄λ¦¬νκΈ° μ¬μ΄ μ²ν¬(chunk)λ‘ λλμ΄ νμν λ λ‘λν μ μκ² ν¨μΌλ‘μ¨ μ΄ λ¬Έμ λ₯Ό ν΄κ²°νλ κ°λ ₯ν κΈ°μ μ λλ€.
μ΄ κ°μ΄λμμλ νλ‘ νΈμλ μ½λ μ€ν리ν μ λ κ°μ§ μ£Όμ μ λ΅μΈ λΌμ°νΈ κΈ°λ°κ³Ό μ»΄ν¬λνΈ κΈ°λ° μ½λ μ€ν리ν μ μ΄ν΄λ΄ λλ€. κ° μ κ·Ό λ°©μμ μ리λ₯Ό κΉμ΄ νκ³ λ€κ³ , μ₯λ¨μ μ λ Όνλ©°, ꡬνμ μ€λͺ νκΈ° μν μ€μ μμ λ₯Ό μ 곡ν κ²μ λλ€.
μ½λ μ€ν리ν μ΄λ 무μμΈκ°?
μ½λ μ€ν리ν μ νλμ κ±°λν μλ°μ€ν¬λ¦½νΈ λ²λ€μ λ μμ λ²λ€ λλ μ²ν¬λ‘ λΆν νλ κ΄νμ λλ€. μ 체 μ ν리μΌμ΄μ μ½λλ₯Ό 미리 λ‘λνλ λμ , νμ¬ λ·°λ μ»΄ν¬λνΈμ νμν μ½λλ§ λ‘λν©λλ€. μ΄λ μ΄κΈ° λ€μ΄λ‘λ ν¬κΈ°λ₯Ό μ€μ¬ νμ΄μ§ λ‘λ μκ°μ λ¨μΆνκ³ μ²΄κ° μ±λ₯μ ν₯μμν΅λλ€.
μ½λ μ€ν리ν μ μ£Όμ μ΄μ μ λ€μκ³Ό κ°μ΅λλ€:
- μ΄κΈ° λ‘λ μκ° κ°μ : μ΄κΈ° λ²λ€ ν¬κΈ°κ° μμμλ‘ λ‘λ μκ°μ΄ λΉ¨λΌμ Έ μ¬μ©μμκ² λ μ’μ 첫μΈμμ μ€λλ€.
- νμ± λ° μ»΄νμΌ μκ° λ¨μΆ: λΈλΌμ°μ κ° λ μμ λ²λ€μ νμ±νκ³ μ»΄νμΌνλ λ° λ μ μ μκ°μ μλΉνμ¬ λ λλ§ μλκ° λΉ¨λΌμ§λλ€.
- μ¬μ©μ κ²½ν ν₯μ: λ λΉ λ₯Έ λ‘λ μκ°μ λ λΆλλ½κ³ λ°μμ±μ΄ λ°μ΄λ μ¬μ©μ κ²½νμ κΈ°μ¬ν©λλ€.
- 리μμ€ μ¬μ© μ΅μ ν: νμν μ½λλ§ λ‘λνμ¬ λμνκ³Ό μ₯μΉ λ¦¬μμ€λ₯Ό μ μ½ν©λλ€.
λΌμ°νΈ κΈ°λ° μ½λ μ€ν리ν
λΌμ°νΈ κΈ°λ° μ½λ μ€ν리ν μ μ ν리μΌμ΄μ μ λΌμ°νΈ λλ νμ΄μ§λ₯Ό κΈ°λ°μΌλ‘ μ ν리μΌμ΄μ μ½λλ₯Ό λΆν νλ κ²μ ν¬ν¨ν©λλ€. κ° λΌμ°νΈλ μ¬μ©μκ° ν΄λΉ λΌμ°νΈλ‘ μ΄λν λλ§ λ‘λλλ λ³λμ μ½λ μ²ν¬μ ν΄λΉν©λλ€. μ΄ μ κ·Ό λ°©μμ μμ£Ό μ‘μΈμ€νμ§ μλ λ³κ°μ μΉμ μ΄λ κΈ°λ₯μ΄ μλ μ ν리μΌμ΄μ μ νΉν ν¨κ³Όμ μ λλ€.
ꡬν
React, Angular, Vueμ κ°μ νλμ μΈ μλ°μ€ν¬λ¦½νΈ νλ μμν¬λ μ’ μ’ λμ μν¬νΈ(dynamic import)λ₯Ό νμ©νμ¬ λΌμ°νΈ κΈ°λ° μ½λ μ€ν리ν μ μν λ΄μ₯ μ§μμ μ 곡ν©λλ€. κ°λ μ μΌλ‘ μλ λ°©μμ λ€μκ³Ό κ°μ΅λλ€:
- λΌμ°νΈ μ μ: React Router, Angular Router λλ Vue Routerμ κ°μ λΌμ°ν λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νμ¬ μ ν리μΌμ΄μ μ λΌμ°νΈλ₯Ό μ μν©λλ€.
- λμ μν¬νΈ μ¬μ©: μ»΄ν¬λνΈλ₯Ό μ§μ μν¬νΈνλ λμ λμ μν¬νΈ(
import())λ₯Ό μ¬μ©νμ¬ ν΄λΉ λΌμ°νΈκ° νμ±νλ λ λΉλκΈ°μ μΌλ‘ λ‘λν©λλ€. - λΉλ λꡬ ꡬμ±: λΉλ λꡬ(μ: webpack, Parcel, Rollup)κ° λμ μν¬νΈλ₯Ό μΈμνκ³ κ° λΌμ°νΈμ λν΄ λ³λμ μ²ν¬λ₯Ό μμ±νλλ‘ κ΅¬μ±ν©λλ€.
μμ (Reactμ React Router)
/homeκ³Ό /about λ κ°μ λΌμ°νΈλ₯Ό κ°μ§ κ°λ¨ν React μ ν리μΌμ΄μ
μ μκ°ν΄ λ΄
μλ€.
// App.js
import React, { Suspense, lazy } from 'react';
import { BrowserRouter as Router, Route, Switch } from 'react-router-dom';
const Home = lazy(() => import('./components/Home'));
const About = lazy(() => import('./components/About'));
function App() {
return (
λ‘λ© μ€... μ΄ μμ μμ Homeκ³Ό About μ»΄ν¬λνΈλ React.lazy()μ λμ μν¬νΈλ₯Ό μ¬μ©νμ¬ μ§μ° λ‘λ©λ©λλ€. Suspense μ»΄ν¬λνΈλ μ»΄ν¬λνΈκ° λ‘λλλ λμ ν΄λ°±(fallback) UIλ₯Ό μ 곡ν©λλ€. React Routerλ λ΄λΉκ²μ΄μ
μ μ²λ¦¬νκ³ νμ¬ λΌμ°νΈλ₯Ό κΈ°λ°μΌλ‘ μ¬λ°λ₯Έ μ»΄ν¬λνΈκ° λ λλ§λλλ‘ ν©λλ€.
μμ (Angular)
Angularμμλ μ§μ° λ‘λ© λͺ¨λμ μ¬μ©νμ¬ λΌμ°νΈ κΈ°λ° μ½λ μ€ν리ν μ ꡬνν©λλ€.
// app-routing.module.ts
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
const routes: Routes = [
{ path: 'home', loadChildren: () => import('./home/home.module').then(m => m.HomeModule) },
{ path: 'about', loadChildren: () => import('./about/about.module').then(m => m.AboutModule) }
];
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule]
})
export class AppRoutingModule { }
μ¬κΈ°μ λΌμ°νΈ ꡬμ±μ loadChildren μμ±μ μ§μ° λ‘λ©λμ΄μΌ ν λͺ¨λμ κ²½λ‘λ₯Ό μ§μ ν©λλ€. Angular λΌμ°ν°λ μ¬μ©μκ° ν΄λΉ λΌμ°νΈλ‘ μ΄λν λλ§ λͺ¨λκ³Ό κ΄λ ¨ μ»΄ν¬λνΈλ₯Ό μλμΌλ‘ λ‘λν©λλ€.
μμ (Vue.js)
Vue.js λν λΌμ°ν° ꡬμ±μμ λμ μν¬νΈλ₯Ό μ¬μ©νμ¬ λΌμ°νΈ κΈ°λ° μ½λ μ€ν리ν μ μ§μν©λλ€.
// router.js
import Vue from 'vue';
import VueRouter from 'vue-router';
Vue.use(VueRouter);
const routes = [
{ path: '/', component: () => import('./components/Home.vue') },
{ path: '/about', component: () => import('./components/About.vue') }
];
const router = new VueRouter({
routes
});
export default router;
λΌμ°νΈ ꡬμ±μ component μ΅μ
μ λμ μν¬νΈλ₯Ό μ¬μ©νμ¬ μ»΄ν¬λνΈλ₯Ό λΉλκΈ°μ μΌλ‘ λ‘λν©λλ€. Vue Routerλ λΌμ°νΈμ μ‘μΈμ€ν λ μ»΄ν¬λνΈμ λ‘λ© λ° λ λλ§μ μ²λ¦¬ν©λλ€.
λΌμ°νΈ κΈ°λ° μ½λ μ€ν리ν μ μ₯μ
- ꡬν μ©μ΄μ±: λΌμ°νΈ κΈ°λ° μ½λ μ€ν리ν μ νΉν νλ νλ μμν¬μμ μ 곡νλ μ§μ λλΆμ λΉκ΅μ κ°λ¨νκ² κ΅¬νν μ μμ΅λλ€.
- λͺ νν κ΄μ¬μ¬ λΆλ¦¬: κ° λΌμ°νΈλ μ ν리μΌμ΄μ μ λ³κ° μΉμ μ λνλ΄λ―λ‘ μ½λμ κ·Έ μμ‘΄μ±μ λν΄ μΆλ‘ νκΈ° μ½μ΅λλ€.
- λκ·λͺ¨ μ ν리μΌμ΄μ μ ν¨κ³Όμ : λΌμ°νΈ κΈ°λ° μ½λ μ€ν리ν μ λ§μ λΌμ°νΈμ κΈ°λ₯μ κ°μ§ λκ·λͺ¨ μ ν리μΌμ΄μ μ νΉν μ μ©ν©λλ€.
λΌμ°νΈ κΈ°λ° μ½λ μ€ν리ν μ λ¨μ
- μΈλΆν λΆμ‘±: λΌμ°νΈ κΈ°λ° μ½λ μ€ν리ν μ μ¬λ¬ λΌμ°νΈμμ 곡μ λλ 볡μ‘ν μ»΄ν¬λνΈκ° μλ μ ν리μΌμ΄μ μλ μΆ©λΆνμ§ μμ μ μμ΅λλ€.
- μ¬μ ν λμ μ΄κΈ° λ‘λ μκ°: λΌμ°νΈκ° λ§μ μμ‘΄μ±μ ν¬ν¨νλ κ²½μ° ν΄λΉ λΌμ°νΈμ μ΄κΈ° λ‘λ μκ°μ΄ μ¬μ ν κΈΈ μ μμ΅λλ€.
μ»΄ν¬λνΈ κΈ°λ° μ½λ μ€ν리ν
μ»΄ν¬λνΈ κΈ°λ° μ½λ μ€ν리ν μ μ ν리μΌμ΄μ μ½λλ₯Ό κ°λ³ μ»΄ν¬λνΈ κΈ°λ°μ λ μμ μ²ν¬λ‘ λΆν νμ¬ μ½λ μ€ν리ν μ ν λ¨κ³ λ λ°μ μν΅λλ€. μ΄ μ κ·Ό λ°©μμ μ½λ λ‘λ©μ λν λ μΈλΆνλ μ μ΄λ₯Ό κ°λ₯νκ² νλ©°, 볡μ‘ν UIμ μ¬μ¬μ© κ°λ₯ν μ»΄ν¬λνΈκ° μλ μ ν리μΌμ΄μ μ νΉν ν¨κ³Όμ μΌ μ μμ΅λλ€.
ꡬν
μ»΄ν¬λνΈ κΈ°λ° μ½λ μ€ν리ν λν λμ μν¬νΈμ μμ‘΄νμ§λ§, μ 체 λΌμ°νΈλ₯Ό λ‘λνλ λμ κ°λ³ μ»΄ν¬λνΈλ₯Ό νμμ λ°λΌ λ‘λν©λλ€. μ΄λ λ€μκ³Ό κ°μ κΈ°μ μ μ¬μ©νμ¬ λ¬μ±ν μ μμ΅λλ€:
- μ»΄ν¬λνΈ μ§μ° λ‘λ©: λμ μν¬νΈλ₯Ό μ¬μ©νμ¬ μ»΄ν¬λνΈκ° μ²μ λ λλ§λ λλ νΉμ μ΄λ²€νΈκ° λ°μν λμ κ°μ΄ νμν λλ§ λ‘λν©λλ€.
- μ‘°κ±΄λΆ λ λλ§: μ¬μ©μ μνΈμμ©μ΄λ λ€λ₯Έ μμΈμ λ°λΌ μ»΄ν¬λνΈλ₯Ό 쑰건λΆλ‘ λ λλ§νκ³ , μ‘°κ±΄μ΄ μΆ©μ‘±λ λλ§ μ»΄ν¬λνΈ μ½λλ₯Ό λ‘λν©λλ€.
- Intersection Observer API: Intersection Observer APIλ₯Ό μ¬μ©νμ¬ μ»΄ν¬λνΈκ° λ·°ν¬νΈμ νμλ λλ₯Ό κ°μ§νκ³ κ·Έμ λ°λΌ μ½λλ₯Ό λ‘λν©λλ€. μ΄λ μ΄κΈ°μ νλ©΄ λ°μ μλ μ»΄ν¬λνΈλ₯Ό λ‘λνλ λ° νΉν μ μ©ν©λλ€.
μμ (React)
import React, { Suspense, lazy } from 'react';
const MyComponent = lazy(() => import('./MyComponent'));
function App() {
return (
λ‘λ© μ€... }>